#!/bin/bash

# 日志清理脚本

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
LOG_DIR="logs"
RETENTION_DAYS=30
CONTAINER_NAME="git-env-dev"

echo -e "${BLUE}开始清理日志文件...${NC}"

# 检查日志目录
if [ ! -d "$LOG_DIR" ]; then
    echo -e "${YELLOW}日志目录不存在: $LOG_DIR${NC}"
    exit 0
fi

# 清理应用日志
echo -e "${BLUE}清理应用日志...${NC}"
find $LOG_DIR/app -name "*.log" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;
find $LOG_DIR/app -name "*.log.*" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;

# 清理PostgreSQL日志
echo -e "${BLUE}清理PostgreSQL日志...${NC}"
find $LOG_DIR/postgresql -name "*.log" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;

# 清理Redis日志
echo -e "${BLUE}清理Redis日志...${NC}"
find $LOG_DIR/redis -name "*.log" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;

# 清理Celery日志
echo -e "${BLUE}清理Celery日志...${NC}"
find $LOG_DIR/celery -name "*.log" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;
find $LOG_DIR/celery -name "celerybeat-schedule" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;

# 清理Docker容器日志
echo -e "${BLUE}清理Docker容器日志...${NC}"
if docker ps -a --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
    # 截断容器内的日志文件
    docker exec "${CONTAINER_NAME}" bash -c "
        find /var/log -name '*.log' -type f -mtime +${RETENTION_DAYS} -delete 2>/dev/null || true
        find /app/logs -name '*.log' -type f -mtime +${RETENTION_DAYS} -delete 2>/dev/null || true
    "

    # 清理Docker守护进程日志
    echo -e "${YELLOW}清理Docker守护进程日志...${NC}"
    sudo truncate -s 0 /var/lib/docker/containers/*/${CONTAINER_NAME}-json.log 2>/dev/null || true
fi

# 压缩大日志文件
echo -e "${BLUE}压缩大日志文件...${NC}"
find $LOG_DIR -name "*.log" -size +10M -exec gzip {} \;
find $LOG_DIR -name "*.log.*" -size +10M -exec gzip {} \;

# 清理空文件
echo -e "${BLUE}清理空文件...${NC}"
find $LOG_DIR -type f -empty -delete

# 显示清理后的磁盘使用情况
echo -e "${BLUE}日志目录磁盘使用情况:${NC}"
du -sh $LOG_DIR/*

# 显示总的清理效果
TOTAL_SIZE=$(du -sh $LOG_DIR | cut -f1)
echo -e "${GREEN}日志清理完成!${NC}"
echo -e "${GREEN}日志目录总大小: ${TOTAL_SIZE}${NC}"

# 设置定时清理
echo -e "${BLUE}设置定时清理任务...${NC}"
CRON_JOB="0 2 * * * $(pwd)/logs-cleanup.sh"
if ! crontab -l 2>/dev/null | grep -F "$CRON_JOB"; then
    (crontab -l 2>/dev/null; echo "$CRON_JOB") | crontab -
    echo -e "${GREEN}已添加定时清理任务: 每天凌晨2点执行${NC}"
else
    echo -e "${YELLOW}定时清理任务已存在${NC}"
fi

echo -e "${GREEN}日志清理脚本执行完成!${NC}"